package com.example.no1admin.service.impl;

import com.example.no1admin.ex.ServiceException;
import com.example.no1admin.mapper.PackagesMapper;
import com.example.no1admin.mapper.PictureMapper;
import com.example.no1admin.mapper.StyleMapper;
import com.example.no1admin.pojo.dto.style.StyleAddNewDTO;
import com.example.no1admin.pojo.dto.style.StyleEditDTO;
import com.example.no1admin.pojo.entity.Picture;
import com.example.no1admin.pojo.entity.Style;
import com.example.no1admin.pojo.vo.packages.PackagesListItemVO;
import com.example.no1admin.pojo.vo.style.StyleDetailVO;
import com.example.no1admin.pojo.vo.style.StyleListItemVO;
import com.example.no1admin.service.IStyleService;
import com.example.no1admin.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class StyleServiceImpl implements IStyleService {
    @Autowired
    private StyleMapper styleMapper;
    @Autowired
    private PackagesMapper packagesMapper;
    @Autowired
    private PictureMapper pictureMapper;

    public StyleServiceImpl() {
        log.debug("创建业务逻辑对象：StyleServiceImpl");
    }

    @Override
    public void addNew(StyleAddNewDTO styleAddNewDTO) {
        log.debug("开始处理创建拍摄风格的业务，参数：{}", styleAddNewDTO);
        if (styleAddNewDTO.getUrl() != null) {
            int count = pictureMapper.countByUrl(styleAddNewDTO.getUrl());
            if (count != 1) {
                String message = "路线图片不存在！";
                log.error(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
            Picture picture = new Picture();
            picture.setAlbumId(styleAddNewDTO.getAlbumId());
            picture.setUrl(styleAddNewDTO.getUrl());
            picture.setIsCover(1);
            int rows = pictureMapper.updateByUrl(picture);
            if (rows != 1) {
                String message = "图片上传失败，服务器忙，请稍后再次尝试！";
                log.error(message);
                throw new ServiceException(ServiceCode.ERR_INSERT, message);
            }
        }


        // 检查此拍摄风格（尝试创建的拍摄风格）的名称有没有被使用
        // 如果已经被使用，则不允许创建
        String name = styleAddNewDTO.getName();
        int count = styleMapper.countByName(name);
        if (count > 0) {
            String message = "创建拍摄风格失败，拍摄风格名称【" + name + "】已经被占用！";
            log.error(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 创建实体对象（Mapper的方法的参数是实体类型）
        Style style = new Style();

        // 将当前方法参数的值复制到Brand实体类型的对象中
        BeanUtils.copyProperties(styleAddNewDTO, style);
        // 补全属性值（不由客户端提交的属性的值，应该在插入之前补全）

        // 将拍摄风格数据写入到数据库中
        log.debug("即将向表中写入数据：{}", style);
        int rows = styleMapper.insert(style);
        if (rows != 1) {
            String message = "创建拍摄风格失败，服务器忙，请稍后再次尝试！";
            log.error(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void deleteById(Long id) {
        log.debug("开始处理删除拍摄风格的业务,id={}",id);
        StyleDetailVO style = styleMapper.getById(id);
        if(style==null){
            String message = "删除拍摄风格失败，尝试删除的数据【"+id+"】不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        List<PackagesListItemVO> packagesList = packagesMapper.list();
        for(PackagesListItemVO packages :packagesList){
            if(packages.getRouteId().equals(id)){
                String message = "删除摄影师失败，"+packages.getName()+"套餐内包含该摄影师,请核验！";
                throw new ServiceException(ServiceCode.ERR_DELETE,message);
            }
        }
        int rows = styleMapper.deleteById(id);
        if(rows!=1){
            String message = "删除拍摄风格失败，服务器忙，请稍后再试!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
    }

    @Override
    public void updateById(StyleEditDTO styleEditDTO) {
        StyleDetailVO byId = styleMapper.getById(styleEditDTO.getId());
        if (byId==null){
            String message = "修改拍摄风格不存在，请刷新!";
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }
        Style style = new Style();
        BeanUtils.copyProperties(styleEditDTO,style);
        //将拍摄风格数据写入到数据库
        log.debug("即将向表中插入需要修改的数据：{}",style);
        int rows = styleMapper.updateById(style);
        if(rows!=1){
            String message = "修改拍摄风格失败，服务器忙，请稍后再试!";
            log.error(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }

    }

    @Override
    public List<StyleListItemVO> list() {
        return styleMapper.list();
    }
}
